package com.liuyucheng.concurrent.callable;

import java.util.concurrent.*;

public class CallableExample {
    public static void main(String[] args) {
        // 创建线程池
        ExecutorService executor = Executors.newFixedThreadPool(2);

        // 提交任务1：计算1到100的和
        Future<Integer> future1 = executor.submit(() -> {
            System.out.println("任务1开始执行");
            int sum = 0;
            for (int i = 1; i <= 100; i++) {
                sum += i;
            }
            Thread.sleep(2000); // 模拟耗时操作
            System.out.println("任务1执行完成");
            return sum;
        });

        // 提交任务2：计算2的10次方
        Future<Double> future2 = executor.submit(() -> {
            System.out.println("任务2开始执行");
            double result = Math.pow(2, 10);
            Thread.sleep(1500); // 模拟耗时操作
            System.out.println("任务2执行完成");
            return result;
        });

        try {
            // 获取任务1的结果（阻塞等待）
            Integer sumResult = future1.get();
            System.out.println("任务1结果：" + sumResult);

            // 获取任务2的结果（带超时处理）
            Double powerResult = future2.get(3, TimeUnit.SECONDS);
            System.out.println("任务2结果：" + powerResult);

        } catch (InterruptedException e) {
            System.out.println("线程被中断");
            Thread.currentThread().interrupt();
        } catch (ExecutionException e) {
            System.out.println("任务执行异常：" + e.getCause());
        } catch (TimeoutException e) {
            System.out.println("任务2超时未完成");
            future2.cancel(true); // 取消未完成的任务
        } finally {
            // 关闭线程池
            executor.shutdown();
            try {
                if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
                    executor.shutdownNow();
                }
            } catch (InterruptedException e) {
                executor.shutdownNow();
            }
        }
    }
}